package fr.charlott.view;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.charlott.business.dto.HotesseDTO;
import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.service.HotesseService;
import fr.charlott.tools.exceptions.FunctionalException;
import fr.charlott.tools.exceptions.TechnicalException;

@Component("nouvelleHotesseControler")
@Scope("view")
public class NouvelleHotesseControler extends CharlottControler {

    private static final long serialVersionUID = -6404906491610002771L;

    public static final String EDITED_HOTESSE = "editedHotesse";

    /**
     * Service
     */
    private HotesseService hotesseService;

    private HotesseDTO hotesse;

    private ProduitDTO[] selectedProduits;

    public NouvelleHotesseControler() {
        super();
    }

    @Autowired(required = true)
    public NouvelleHotesseControler(HotesseService hotesseService) {
        super();
        this.hotesseService = hotesseService;

        // Recupere la personne selectionnee dans la session
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        hotesse = (HotesseDTO) externalContext.getSessionMap().get(EDITED_HOTESSE);

        if (hotesse == null) {
            hotesse = new HotesseDTO();
        }
    }

    public void selectionnerProduitsListener(ActionEvent actionEvent) {
        List<ProduitDTO> list = new ArrayList<ProduitDTO>();
        for (ProduitDTO p : selectedProduits) {
            list.add(p);
        }
        hotesse.setProduits(list);
    }

    // navigation
    public String ajouterHotesse() throws TechnicalException, FunctionalException {
        try {
            hotesseService.ajouterHotesse(hotesse);
            cleanSession(EDITED_HOTESSE);
            return "listeHotesses";
        } catch (TechnicalException e) {
            FacesMessage msg = new FacesMessage("Error", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return null;
        }
    }

    public String annuler() {
        cleanSession(EDITED_HOTESSE);
        return "listeHotesses";
    }

    // getters / setters

    public HotesseDTO getHotesse() {
        return hotesse;
    }

    public ProduitDTO[] getSelectedProduits() {
        if (hotesse.getProduits() != null) {
            if (hotesse.getProduits().size() > 0) {
                ProduitDTO[] t_produits = new ProduitDTO[hotesse.getProduits().size()];
                for (int i = 0; i < hotesse.getProduits().size(); i++) {
                    t_produits[i] = hotesse.getProduits().get(i);
                }
                return t_produits;
            }
        }
        return selectedProduits;
    }

    public void setSelectedProduits(ProduitDTO[] selectedProduits) {
        this.selectedProduits = selectedProduits;
    }

}